import json
import random
from datetime import datetime

class OptimizationPromptGenerator:
    """优化问题智能提示词生成器"""
    
    def __init__(self):
        self.problem_templates = {
            "线性规划": {
                "description": "线性目标函数和线性约束的优化问题",
                "examples": [
                    "某工厂生产两种产品，求最大利润的生产计划",
                    "运输问题：从多个供应点向多个需求点运输货物，最小化运输成本",
                    "资源分配：在有限资源下分配给不同项目以最大化收益"
                ],
                "keywords": ["最大化利润", "最小化成本", "资源约束", "生产计划", "运输优化"]
            },
            "整数规划": {
                "description": "决策变量必须为整数的优化问题",
                "examples": [
                    "背包问题：在重量限制下选择物品使价值最大",
                    "设施选址：选择最优的工厂或仓库位置",
                    "人员排班：安排员工班次以满足需求并最小化成本"
                ],
                "keywords": ["选择问题", "0-1变量", "离散决策", "组合优化", "整数约束"]
            },
            "网络优化": {
                "description": "图论和网络流相关的优化问题",
                "examples": [
                    "最短路径：找到从起点到终点的最短路径",
                    "最大流问题：网络中的最大流量",
                    "最小生成树：连接所有节点的最小成本树"
                ],
                "keywords": ["路径优化", "网络流", "图论", "连通性", "流量分配"]
            },
            "多目标优化": {
                "description": "同时优化多个相互冲突的目标",
                "examples": [
                    "产品设计：同时考虑成本、质量和性能",
                    "投资组合：平衡收益和风险",
                    "供应链设计：权衡成本、服务水平和环境影响"
                ],
                "keywords": ["帕累托前沿", "权重分配", "目标冲突", "折中方案", "多准则决策"]
            },
            "动态规划": {
                "description": "分阶段决策的优化问题",
                "examples": [
                    "库存管理：多期库存控制策略",
                    "投资决策：多年投资计划优化",
                    "设备更换：确定最优的设备更换时机"
                ],
                "keywords": ["阶段决策", "状态转移", "时间序列", "递推关系", "最优子结构"]
            },
            "随机优化": {
                "description": "包含不确定性因素的优化问题",
                "examples": [
                    "风险管理：在不确定环境下的决策",
                    "供应链鲁棒性：应对需求波动的策略",
                    "金融投资：考虑市场风险的投资组合"
                ],
                "keywords": ["不确定性", "风险评估", "鲁棒优化", "随机变量", "概率约束"]
            }
        }
        
        self.industry_scenarios = {
            "制造业": ["生产计划优化", "设备维护调度", "质量控制", "供应链管理", "库存优化"],
            "物流运输": ["路径规划", "车辆调度", "仓储布局", "配送优化", "运力分配"],
            "金融投资": ["投资组合优化", "风险管理", "资产配置", "信贷决策", "保险定价"],
            "能源电力": ["发电调度", "电网规划", "能源分配", "负荷预测", "可再生能源整合"],
            "零售商业": ["定价策略", "促销优化", "库存管理", "选址决策", "客户细分"],
            "医疗健康": ["资源分配", "排班优化", "治疗方案", "药物配送", "设备利用"],
            "农业生产": ["种植规划", "灌溉优化", "收获调度", "资源配置", "产量预测"]
        }
        
        self.constraint_types = [
            "资源限制（如资金、时间、人力）",
            "容量约束（如生产能力、存储空间）",
            "需求满足（如客户需求、市场要求）",
            "技术限制（如设备能力、工艺要求）",
            "政策法规（如环保标准、安全规定）",
            "质量标准（如产品质量、服务水平）",
            "时间窗口（如交货期限、工作时间）",
            "平衡约束（如供需平衡、流量守恒）"
        ]
        
        self.objective_types = [
            "最大化利润/收益",
            "最小化成本/费用",
            "最大化效率/产出",
            "最小化时间/延迟",
            "最大化客户满意度",
            "最小化风险/损失",
            "最大化资源利用率",
            "最小化环境影响"
        ]
    
    def generate_smart_prompts(self, num_prompts=10):
        """生成智能提示词"""
        prompts = []
        
        for i in range(num_prompts):
            # 随机选择问题类型和行业
            problem_type = random.choice(list(self.problem_templates.keys()))
            industry = random.choice(list(self.industry_scenarios.keys()))
            scenario = random.choice(self.industry_scenarios[industry])
            
            # 随机选择目标和约束
            objective = random.choice(self.objective_types)
            constraints = random.sample(self.constraint_types, random.randint(2, 4))
            
            # 生成提示词
            prompt = self._create_prompt(problem_type, industry, scenario, objective, constraints)
            
            prompts.append({
                "id": i + 1,
                "problem_type": problem_type,
                "industry": industry,
                "scenario": scenario,
                "objective": objective,
                "constraints": constraints,
                "prompt": prompt,
                "difficulty": self._assess_difficulty(problem_type, len(constraints)),
                "estimated_time": self._estimate_time(problem_type, len(constraints))
            })
        
        return prompts
    
    def _create_prompt(self, problem_type, industry, scenario, objective, constraints):
        """创建具体的提示词"""
        template_parts = [
            f"请帮我解决一个{industry}领域的{scenario}优化问题。",
            f"这是一个{problem_type}问题，目标是{objective}。",
            "主要约束条件包括：",
        ]
        
        # 添加约束条件
        for i, constraint in enumerate(constraints, 1):
            template_parts.append(f"{i}. {constraint}")
        
        template_parts.extend([
            "",
            "请提供：",
            "1. 数学模型的建立（决策变量、目标函数、约束条件）",
            "2. 求解方法和算法选择",
            "3. 结果分析和解释",
            "4. 实际应用建议"
        ])
        
        return "\n".join(template_parts)
    
    def _assess_difficulty(self, problem_type, num_constraints):
        """评估问题难度"""
        base_difficulty = {
            "线性规划": 2,
            "整数规划": 3,
            "网络优化": 3,
            "多目标优化": 4,
            "动态规划": 4,
            "随机优化": 5
        }
        
        difficulty = base_difficulty.get(problem_type, 3)
        difficulty += min(num_constraints - 2, 2)  # 约束越多越难
        
        if difficulty <= 2:
            return "简单"
        elif difficulty <= 3:
            return "中等"
        elif difficulty <= 4:
            return "困难"
        else:
            return "专家级"
    
    def _estimate_time(self, problem_type, num_constraints):
        """估算解决时间"""
        base_time = {
            "线性规划": 30,
            "整数规划": 45,
            "网络优化": 40,
            "多目标优化": 60,
            "动态规划": 50,
            "随机优化": 70
        }
        
        time_minutes = base_time.get(problem_type, 45)
        time_minutes += (num_constraints - 2) * 10
        
        return f"{time_minutes}分钟"
    
    def generate_specific_prompts(self, problem_type=None, industry=None):
        """生成特定类型的提示词"""
        if problem_type and problem_type in self.problem_templates:
            template = self.problem_templates[problem_type]
            prompts = []
            
            for example in template["examples"]:
                prompt = f"请帮我解决以下{problem_type}问题：\n\n{example}\n\n"
                prompt += "请提供完整的数学建模和求解方案，包括：\n"
                prompt += "1. 决策变量定义\n2. 目标函数建立\n3. 约束条件设置\n4. 求解算法选择\n5. 结果分析解释"
                
                prompts.append({
                    "problem_type": problem_type,
                    "example": example,
                    "prompt": prompt,
                    "keywords": template["keywords"]
                })
            
            return prompts
        
        return []
    
    def create_interactive_prompts(self):
        """创建交互式提示词"""
        interactive_prompts = [
            {
                "title": "问题诊断助手",
                "prompt": "我有一个优化问题，但不确定属于哪种类型。问题描述：[请描述您的具体问题]。请帮我分析这是什么类型的优化问题，并提供解决思路。"
            },
            {
                "title": "数据准备指导",
                "prompt": "我想解决[具体问题类型]，但不知道需要准备哪些数据。请告诉我需要收集哪些数据，数据格式要求，以及如何组织这些数据。"
            },
            {
                "title": "算法选择建议",
                "prompt": "对于[问题描述]，有多种求解算法可选。请比较不同算法的优缺点，并推荐最适合的算法，说明选择理由。"
            },
            {
                "title": "结果验证帮助",
                "prompt": "我已经得到了优化结果：[结果数据]。请帮我验证结果的正确性，分析结果的合理性，并提供改进建议。"
            },
            {
                "title": "实施方案设计",
                "prompt": "优化模型已经建立并求解完成，现在需要将理论结果转化为实际可执行的方案。请帮我设计具体的实施步骤和注意事项。"
            }
        ]
        
        return interactive_prompts

def main():
    """主函数"""
    generator = OptimizationPromptGenerator()
    
    print("=== 优化问题智能提示词生成器 ===")
    print(f"生成时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print()
    
    # 生成通用智能提示词
    print("1. 通用智能提示词（随机生成）")
    print("=" * 50)
    smart_prompts = generator.generate_smart_prompts(8)
    
    for prompt_data in smart_prompts:
        print(f"\n【提示词 {prompt_data['id']}】")
        print(f"类型：{prompt_data['problem_type']} | 行业：{prompt_data['industry']}")
        print(f"难度：{prompt_data['difficulty']} | 预估时间：{prompt_data['estimated_time']}")
        print(f"场景：{prompt_data['scenario']}")
        print("\n提示词内容：")
        print(prompt_data['prompt'])
        print("-" * 80)
    
    # 生成特定类型提示词
    print("\n\n2. 特定类型提示词示例")
    print("=" * 50)
    
    for problem_type in ["线性规划", "整数规划", "网络优化"]:
        print(f"\n【{problem_type}类型提示词】")
        specific_prompts = generator.generate_specific_prompts(problem_type)
        
        for i, prompt_data in enumerate(specific_prompts[:2], 1):  # 只显示前2个
            print(f"\n示例 {i}：{prompt_data['example']}")
            print(f"关键词：{', '.join(prompt_data['keywords'][:3])}")
            print("\n完整提示词：")
            print(prompt_data['prompt'][:200] + "...")
            print("-" * 60)
    
    # 生成交互式提示词
    print("\n\n3. 交互式提示词模板")
    print("=" * 50)
    
    interactive_prompts = generator.create_interactive_prompts()
    for prompt_data in interactive_prompts:
        print(f"\n【{prompt_data['title']}】")
        print(prompt_data['prompt'])
        print("-" * 60)
    
    # 保存所有提示词到文件
    all_prompts = {
        "generation_time": datetime.now().isoformat(),
        "smart_prompts": smart_prompts,
        "specific_prompts": {
            problem_type: generator.generate_specific_prompts(problem_type)
            for problem_type in generator.problem_templates.keys()
        },
        "interactive_prompts": interactive_prompts,
        "problem_templates": generator.problem_templates,
        "industry_scenarios": generator.industry_scenarios
    }
    
    with open('optimization_prompts_collection.json', 'w', encoding='utf-8') as f:
        json.dump(all_prompts, f, ensure_ascii=False, indent=2)
    
    print("\n\n=== 使用建议 ===")
    print("1. 根据您的具体问题选择合适的提示词类型")
    print("2. 可以修改提示词中的具体参数和约束条件")
    print("3. 建议先从简单问题开始，逐步增加复杂度")
    print("4. 交互式提示词可以帮助您更好地描述问题")
    print("5. 所有提示词已保存到 optimization_prompts_collection.json")
    
    return all_prompts

if __name__ == "__main__":
    main()